/**
 * @file   Alarm.java
 * @author Enrique Madrid <e.madrid@lpcsite.com>
 * @date   Mon Jul 16 14:06:37 2007
 * 
 *   Alarma administrada por Scheduler.
 * 
 * 
 */

package sim.framework;

import sim.framework.*;


public final class Alarm {

    protected int m_Id; // Identificador de la alarma
    protected long m_Period; // periodo en MILLISECONDS (precalc)
    protected int m_Param; // Parametro enviado en DWParam del mensaje.
    protected EventListener m_EventListener; // Controlador de eventos

    private long m_LastTime; // Referencia tiempo en milesegundos

    protected Alarm() {
	disable();
    }

    protected void set(int id, long periode, int param, EventListener e) {
        m_Id = id;
        m_Period = periode;
	m_Param = param;
        m_EventListener = e;
	reset();
    }

    protected void reset() {
	m_LastTime = System.currentTimeMillis();
    }

    protected void disable() {
	set(0, -1, 0, null);
    }

    protected boolean isDisabled() {
	return (m_Period < 0);
    }

    protected boolean isPulse() {
	return (m_Period == 0);
    }

    /** 
     *  Indica si la alarma debe notificar que se ha cumplido.
     * 
     * @param currTime Tiempo actual en milesegundos
     * @param factor Factor de conversion a TICKS.
     * 
     * @return Devuelve true si la alarma se ha cumplido
     */
    protected boolean isTimeout(long currTime) {
	long elapse;
	if (!isDisabled()) {
	    elapse = (currTime - m_LastTime);
	    if( elapse >= m_Period) {
		m_LastTime = currTime;
		return true;
	    }
	}
        return false;
    }

    /** 
     *  Notifica al controlador de eventos que el periodo
     *        se ha cumplido
     * 
     * @param msg Mensaje utilizado para notificar al controlador.
     */
    protected void wakeUp(final Msg m) {
	if( m_EventListener != null ) {
	    m.setWParam(m_Id);
	    m.setDWParam(m_Param);
	    m_EventListener.event(m);
	}
    }
}
